package com.hjy.test;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufAllocator;
/*
* 由于 Netty 中有堆外内存（直接内存）的 ByteBuf 实现，堆外内存最好是手动来释放，而不是等 GC 垃圾回收。

UnpooledHeapByteBuf 使用的是 JVM 内存，只需等 GC 回收内存即可
UnpooledDirectByteBuf 使用的就是直接内存了，需要特殊的方法来回收内存
PooledByteBuf 和它的子类使用了池化机制，需要更复杂的规则来回收内存
Netty 这里采用了引用计数法来控制回收内存，每个 ByteBuf 都实现了 ReferenceCounted 接口

每个 ByteBuf 对象的初始计数为 1
调用 release 方法计数减 1，如果计数为 0，ByteBuf 内存被回收
调用 retain 方法计数加 1，表示调用者没用完之前，其它 handler 即使调用了 release 也不会造成回收
当计数为 0 时，底层内存会被回收，这时即使 ByteBuf 对象还在，其各个方法均无法正常使用

* */
public class ByteBufStudy {
    public static void main(String[] args) {



    }

    private static void test1() {
        ByteBuf byteBuf = ByteBufAllocator.DEFAULT.heapBuffer(16);//申请基于堆内存
        System.out.println(byteBuf.getClass());
        ByteBuf byteBuf1 = ByteBufAllocator.DEFAULT.directBuffer(16);//使用直接内存
        System.out.println(byteBuf1.getClass());

        ByteBuf byteBuf2 = ByteBufAllocator.DEFAULT.buffer(16);//模式使用直接内存
        System.out.println(byteBuf2.getClass());
    }

}
